package uds.geoloc;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import uds.data.POI_Database;
import uds.data.UserPreference;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

// MainActivity est l'activité initial qui se lance au démarrage de l'application.
public class MainActivity extends Activity 
{
	// Initialisation des variables des boutons du menu principal
	private Button Plan = null ;
	private Button Ressources = null ;
	private Button Campus = null ;
	private Button Recherche = null ;
	private Button Parametres = null ;
    
	// Initialisation de variables nécessaires
    private ProgressDialog myProgressDialog;
    private Context myContext;
    private DateFormat df ;
    
    // Initialisation des bases de données
    private POI_Database base_poi ;
    private UserPreference usr_pref ;
    
    // Initialisation des valeurs nécessaires pour la ProgressBar
    public static final int MSG_ERR = 0;
    public static final int MSG_CNF = 1;
    public static final int MSG_IND = 2;
     
    public static final String TAG = "ProgressBarActivity";
    
    private ErrorStatus status;
    enum ErrorStatus {
        NO_ERROR, ERROR_1, ERROR_2
    };
    	
   	@Override
    public void onCreate(Bundle savedInstanceState) 
   	{
   		super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // Récupération du context
        myContext = this ;
        
        df = new DateFormat();
        
        // Fonction de vérification/chargement des données
        compute();
        
        // Initialisation des boutons du menu principal
        Plan = (Button) findViewById(R.id.plan);   
        Ressources = (Button) findViewById(R.id.ressources);
        Campus = (Button) findViewById(R.id.campus);
        Recherche = (Button) findViewById(R.id.recherche);
        Parametres = (Button) findViewById(R.id.parametres);
        
        // Initialisation des OnClickListener sur les boutons
        Plan.setOnClickListener(planListener);
        Ressources.setOnClickListener(ressourcesListener);
        Campus.setOnClickListener(campusListener);
        Recherche.setOnClickListener(rechercheListener);
        Parametres.setOnClickListener(parametresListener);
   	}   	
    	
   	// Implémentation du OnClickListener spécifique à "Plan"
    private OnClickListener planListener = new OnClickListener() 
    {
    	@Override
    	public void onClick(View v) 
    	{
    		Intent intent = new Intent(MainActivity.this, PlanActivity.class);

    		startActivity(intent);
    	}
    };

   	// Implémentation du OnClickListener spécifique à "Ressources"    
    private OnClickListener ressourcesListener = new OnClickListener() 
    {
    	@Override
    	public void onClick(View v)
    	{
    		Intent intent = new Intent(MainActivity.this, RessourcesActivity.class);

    		startActivity(intent);
    	}
    };
    
    // Implémentation du OnClickListener spécifique à "Campus" 
    private OnClickListener campusListener = new OnClickListener() 
    {
    	@Override
    	public void onClick(View v)
    	{
    		Intent intent = new Intent(MainActivity.this, CampusActivity.class);

    		startActivity(intent);
    	}
    };
    	
    // Implémentation du OnClickListener spécifique à "Recherche" 		
    private OnClickListener rechercheListener = new OnClickListener() 
    {
    	@Override
    	public void onClick(View v)
    	{
    		Intent intent = new Intent(MainActivity.this, RechercheActivity.class);

    		startActivity(intent);
    	}
    };
    	
    // Implémentation du OnClickListener spécifique à "Paramètres"     	
    private OnClickListener parametresListener = new OnClickListener() 
    {
    	@Override
    	public void onClick(View v)
    	{
    		Intent intent = new Intent(MainActivity.this, ParametresActivity.class);

    		startActivity(intent);
    	}
    };
    	
    // Implémentation de la fonction de vérification/chargement des données
    private void compute() {
    	// Affichage du ProgressDialog
        myProgressDialog = ProgressDialog.show(this, "Veuillez patienter",
                "Chargement des données", true);
        // Implémentation du thread
        new Thread((new Runnable() {
            @Override
            public void run() {
            	Message msg = null;
            	
            	String progressBarData = "Chargement des données";
            	
            	msg = mHandler.obtainMessage(MSG_IND, (Object) progressBarData);
            	 
                mHandler.sendMessage(msg); // "Démarrage" du handler
                
            	status = chargementDonnees(); // Fonction de chargement des données
            	
            	if (ErrorStatus.NO_ERROR != status) { // S'il y a eu un problème
                    Log.e(TAG, "Problème de chargements des données :" + status);
     
                    msg = mHandler.obtainMessage(MSG_ERR, "Problème de chargements des données :" + status);

                    mHandler.sendMessage(msg);
                } else { // Si tout c'est bien passé
                   
                	msg = mHandler.obtainMessage(MSG_CNF,"Chargement accompli !");
                       
                    mHandler.sendMessage(msg);
                }
            	
            }
        })).start();
        
    }
    
    
    public ErrorStatus chargementDonnees() 
    {
    	// Ouverture des bases de données
    	base_poi = new POI_Database(myContext);
        usr_pref = new UserPreference(myContext);  
    	
        // Vérification du premier lancement, ou non, de l'application
    	if (usr_pref.est_premier_lancement())
        {
	    	try {
	        	usr_pref.setDefaultPreferences(); // Fixer les préférences par défaut
	        } catch(Exception e){System.out.println(e.getMessage());}
	
			try
			{
				if (base_poi.initialisation_database()) // Initialisation de la base de données des POI
				{
					usr_pref.setPreference(UserPreference.ATR_DONNEES_IMPORTEES, "oui");
					usr_pref.setPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE, df.format("dd-MM-yyyy", new java.util.Date()).toString());
				}
	        } 
			catch(Exception e)
			{
				System.out.println(e.getMessage());
			}
        } 
    	else 
    	{
    		System.out.println("Vérification si la base de données est à jour");
    		
    		// Ligne de test
    		//usr_pref.setPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE, "24-05-2012");
    		
    		// Récupération de la dernière date de mise à jour
    		String str_date_last_maj = usr_pref.getPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE);
    		//System.out.println("Date retournée : " + str_date_last_maj);
    		SimpleDateFormat curFormater = new SimpleDateFormat("dd-MM-yyyy"); 
    		Date date_last_maj;
    		Date date_today = new Date();
			try 
			{
				date_last_maj = curFormater.parse(str_date_last_maj);
				//System.out.println("Date today : " + date_today.toString() + " - Date mise à jour : " + date_last_maj.toString());
				double nb_jours = POI_Database.getDaysBetweenDates(date_last_maj, date_today);
				System.out.println("Nombre de jour : " + nb_jours);
				if (nb_jours >= 30)
				{
					try // Si dernière mise à jour supérieure à 30 jours :
					{
						if (base_poi.dropAll()) // Vider la base de données des POI
						{
							usr_pref.setPreference(UserPreference.ATR_DONNEES_IMPORTEES, "non");
							if (base_poi.initialisation_database()) // et la recharger
							{
								System.out.println("Mise à jour des données");
								usr_pref.setPreference(UserPreference.ATR_DONNEES_IMPORTEES, "oui");
								usr_pref.setPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE, df.format("dd-MM-yyyy", new java.util.Date()).toString());
							}
						}
			        } 
					catch(Exception e)
					{
						System.out.println(e.getMessage());
					}
				}
			}
			catch (ParseException e) 
			{
				System.out.println("Problème de parse");
				e.printStackTrace();
			}
        }
        return ErrorStatus.NO_ERROR;
    }
    
    // Implémentation du handler qui gère l'affichage ou non du ProgressDialog
    final Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            String text2display = null;
            switch (msg.what) {
            case MSG_IND:
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.setMessage(((String) msg.obj));
                }
                break;
            case MSG_ERR:
                text2display = (String) msg.obj;
                Toast.makeText(myContext, "Erreur : " + text2display,
                        Toast.LENGTH_LONG).show();
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.dismiss();
                }
                break;
            case MSG_CNF:
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.dismiss();
                }
                break;
            default: 
                break;
            }
        }
    };
}